home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 2410 / 2410.xpi / chrome / content / foxmarks-utils.js < prev    next >
Text File  |  2010-01-28  |  5KB  |  176 lines

  1. /*
  2.  forEach, version 1.0
  3.  Copyright 2006, Dean Edwards
  4.  License: http://www.opensource.org/licenses/mit-license.php
  5.  */
  6.  
  7. // array-like enumeration
  8. if (!Array.forEach) { // mozilla already supports this
  9.     Array.forEach = function(array, block, context) {
  10.         for (var i = 0; i < array.length; i++) {
  11.             block.call(context, array[i], i, array);
  12.         }
  13.     };
  14. }
  15.  
  16. // generic enumeration
  17. Function.prototype.forEach = function(object, block, context) {
  18.     for (var key in object) {
  19.         if (typeof this.prototype[key] == "undefined") {
  20.             block.call(context, object[key], key, object);
  21.         }
  22.     }
  23. };
  24.  
  25. // character enumeration
  26. String.forEach = function(string, block, context) {
  27.     Array.forEach(string.split(""), function(chr, index) {
  28.             block.call(context, chr, index, string);
  29.         });
  30. };
  31.  
  32. // globally resolve forEach enumeration
  33. var forEach = function(object, block, context) {
  34.     if (object) {
  35.         var resolve = Object; // default
  36.         if (object instanceof Function) {
  37.             // functions have a "length" property
  38.             resolve = Function;
  39.         } else if (object.forEach instanceof Function) {
  40.             // the object implements a custom forEach method so use that
  41.             object.forEach(block, context);
  42.             return;
  43.         } else if (typeof object == "string") {
  44.             // the object is a string
  45.             resolve = String;
  46.         } else if (typeof object.length == "number") {
  47.             // the object is array-like
  48.             resolve = Array;
  49.         }
  50.         resolve.forEach(object, block, context);
  51.     }
  52. };
  53.  
  54.  
  55. /* function atob is:
  56.  *
  57.  * Copyright (c) 2007, David Lindquist <david.lindquist@gmail.com>
  58.  * Released under the MIT license
  59.  */
  60.  
  61.  
  62. function My_atob(str) {
  63.     var chars = 
  64.         'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  65.     var invalid = {
  66.         strlen: (str.length % 4 != 0),
  67.         chars:  new RegExp('[^' + chars + ']').test(str),
  68.         equals: (/=/.test(str) && (/=[^=]/.test(str) || /={3}/.test(str)))
  69.     };
  70.     if (invalid.strlen || invalid.chars || invalid.equals)
  71.         throw new Error('Invalid base64 data');
  72.     var decoded = [];
  73.     var c = 0;
  74.     while (c < str.length) {
  75.         var i0 = chars.indexOf(str.charAt(c++));
  76.         var i1 = chars.indexOf(str.charAt(c++));
  77.         var i2 = chars.indexOf(str.charAt(c++));
  78.         var i3 = chars.indexOf(str.charAt(c++));
  79.         var buf = (i0 << 18) + (i1 << 12) + ((i2 & 63) << 6) + (i3 & 63);
  80.         var b0 = (buf & (255 << 16)) >> 16;
  81.         var b1 = (i2 == 64) ? -1 : (buf & (255 << 8)) >> 8;
  82.         var b2 = (i3 == 64) ? -1 : (buf & 255);
  83.         decoded.push(b0);
  84.         if (b1 >= 0) decoded.push(b1);
  85.         if (b2 >= 0) decoded.push(b2);
  86.     }
  87.     return decoded;
  88. }
  89.  
  90. function clone (deep) {
  91.     var objectClone = new this.constructor();
  92.     for (var property in this) {
  93.         if (!this.hasOwnProperty(property))
  94.             continue;
  95.         if (deep && typeof this[property] == 'object' && this[property]) {
  96.             objectClone[property] = this[property].clone(deep);
  97.         } else {
  98.             objectClone[property] = this[property];
  99.         }
  100.     }
  101.     return objectClone;
  102. }
  103. Object.prototype.clone = clone;
  104.  
  105. /*
  106.  
  107.  Fron http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:indexOf
  108.  
  109.  indexOf is a JavaScript extension to the ECMA-262 standard; as such it may
  110.  not be present in other implementations of the standard. You can work around 
  111.  this by inserting the following code at the beginning of your scripts, 
  112.  allowing use of indexOf in ECMA-262 implementations which do not natively 
  113.  support it. This algorithm is exactly the one used in Firefox and 
  114.  SpiderMonkey.
  115.  
  116. */
  117.  
  118. if (!Array.prototype.indexOf) {
  119.   Array.prototype.indexOf = function(elt /*, from*/) {
  120.     var len = this.length;
  121.  
  122.     var from = Number(arguments[1]) || 0;
  123.     from = (from < 0)
  124.          ? Math.ceil(from)
  125.          : Math.floor(from);
  126.     if (from < 0)
  127.       from += len;
  128.  
  129.     for (; from < len; from++) {
  130.       if (from in this && this[from] === elt)
  131.         return from;
  132.     }
  133.     return -1;
  134.   };
  135. }
  136.  
  137. if (!Array.prototype.filter) {
  138.   Array.prototype.filter = function(fun /*, thisp*/) {
  139.     var len = this.length;
  140.     if (typeof fun != "function")
  141.       throw new TypeError();
  142.  
  143.     var res = new Array();
  144.     var thisp = arguments[1];
  145.     for (var i = 0; i < len; i++) {
  146.       if (i in this) {
  147.         var val = this[i]; // in case fun mutates this
  148.         if (fun.call(thisp, val, i, this))
  149.           res.push(val);
  150.       }
  151.     }
  152.  
  153.     return res;
  154.   };
  155. }
  156.  
  157. function equals(a, b) {
  158.     if (typeof a != typeof b)
  159.         return false;
  160.     if (typeof a != 'object')
  161.         return a == b;
  162.     if (a == b)
  163.         return true;
  164.     if (a.constructor == Array && b.constructor == Array) {
  165.         if (a.length != b.length)
  166.             return false;
  167.         for (var i = 0; i < a.length; ++i) {
  168.             if (a[i] != b[i])
  169.                 return false;
  170.         }
  171.         return true;
  172.     } else {
  173.         throw Error("can't compare non-Array objects");
  174.     }
  175. }
  176.